#pragma once
#include <glm/glm.hpp>

#include "Renderer.h"
#include "ShaderProgram.h"
#include "GLFW/glfw3.h"
// #include "TextureProxyShader.h"
/**
 * 在 C++ 中，如果两个头文件 互相包含（即 More3D.h 包含 TextureProxyShader.h，而
 * TextureProxyShader.h 又包含 More3D.h），就会导致
 * 循环依赖，编译器可能无法正确解析类型，从而报错 does not name a type。
 *
 * 此外，如果 More3D 是 TextureProxyShader
 * 的友元（friend），情况会更复杂，因为友元声明需要完整的类定义。
 * 方法 1：使用前向声明 + 分离声明与实现
 * 由于 More3D 仅使用 TextureProxyShader*（指针），而 TextureProxyShader 需要
 * More3D 的完整定义（因为是友元），可以这样组织代码
 */
class TextureProxyShader; // 前向声明

class More3D : public Renderer, public ShaderProgram
{
  public:
    More3D(GLFWwindow *window);
    ~More3D();
    unsigned int createShaderProgram() override;

    void prepareVAO();
    void update() override;
    void render();

  private:
    TextureProxyShader* target;
    vector<glm::vec3> cubePositions;
    GLFWwindow *window;
};
